import sys
import os


# 校验文件路径
def path_check(path, ch):
    if ch == "1":
        if os.path.isfile(path):
            print("路径正确")
            return True
        return False
    elif ch == "2":
        if os.path.isdir(path):
            print("路径正确")
            return True
        return False


# 展示操作选项
def index():
    result = {}
    # 获取要替换文本的文件的格式
    print("{:-^60}".format("替换文本选项"))
    print("请选择要替换文本的文件格式")
    print("支持以下格式:")
    print("1.文本文件      .txt")
    print("2.Markdown文件  .md")
    ch = input("请输入'1'或'2':\n")
    if ch == "1":
        result["format"] = ".txt"
    elif ch == "2":
        result["format"] = ".md"
    else:
        print("错误选择")
        sys.exit()

    # 获取要替换文本的文件的范围
    print("请选择要替换的范围")
    print("支持以下范围:")
    print("1.单个文件")
    print(f"2.一个目录,包括其所有文件夹中的{result['format']}文件")
    result["range"] = input("请输入'1'或'2':\n")
    if result["range"] != "1" and result["range"] != "2":
        print("错误选择")
        sys.exit()

    # 获取要替换文本的文件的路径
    while True:
        result["path"] = input(
            "请输入文件或目录的绝对路径:\n例如:D:/Code/my.txt 和 C:/Microsoft/Windows(注意间隔符为'/')\n"
        )
        if not path_check(result["path"], result["range"]):
            print("文件路径有误,该路径不存在指定格式的文件或目录")
            choice = input("'1-继续'或者'2-退出':\n")
            if choice == "2":
                sys.exit()
        else:
            break

    # 在指定目录中要忽略的文件夹
    if result["range"] == "2":
        result["ignore"] = []
        is_ignore = input(f"在{result['path']}目录中是否有要忽略的文件夹:\n1-有\n2-无\n")
        while is_ignore == "1":
            print(
                f"请输入在{result['path']}目录中要忽略的文件夹,被忽略的文件夹中的文件不会进行替换操作.\n请输入要忽略文件夹路径(一定是绝对路径):\n例如:C:/Microsoft/Windows(注意间隔符为'/')"
            )
            i = input()
            result["ignore"].append(i)
            c = input("'1-继续'或者'2-退出':\n")
            if c == "2":
                break

    # 获取要被替换的文本
    result["front"] = input("请输入将被替换的内容:\n")

    # 获取要替换的文本
    result["behind"] = input("请输入用于替换的内容:\n")

    # 确认操作
    print("确认以下内容是否正确:")
    print(f"---要操作的文件格式为:{result['format']}")
    print(f"---要操作的路径为:{result['path']}")
    if result["range"] == "2":
        print(f"---要忽略的文件夹为:{result['ignore']}")
    print(f"---要被替换的文本为:{result['front']}")
    print(f"---用于替换的文本为:{result['behind']}")
    print("'yes'or'no'")
    print("'yes'继续")
    print("'no'退出")
    is_yn = input()
    if is_yn == "no":
        sys.exit()

    # 确认操作
    print("确认要被操作的文件已经备份:")
    print("'yes'or'no'")
    print("'yes'继续")
    print("'no'退出")
    is_yn = input()
    if is_yn == "no":
        sys.exit()

    return result


# 通过递归遍历指定目录下的所有文件夹里的所有指定文件
def recursive_folders(directory, file_format, ignore):
    # 要使用此函数需要有一个全局变量为all_filesname列表
    directory = formatted_path = directory.replace("\\", "/")
    # 遍历当前文件夹的所有文件夹
    for item in os.listdir(directory):
        item_path = os.path.join(directory, item)
        item_path = item_path.replace("\\", "/")

        # 递归调用函数，继续遍历子文件夹
        # 判断是否为文件夹
        if os.path.isdir(item_path):
            # 判断是否为要忽略的文件夹
            if item_path not in ignore:
                recursive_folders(item_path, file_format, ignore)

    # 遍历当前文件夹的所有文件
    for filename in os.listdir(directory):
        # 确保文件是指定文件
        if filename.endswith(file_format):
            file_path = os.path.join(directory, filename)
            formatted_path = file_path.replace("\\", "/")
            print(f"已将识别文件{formatted_path}")
            all_filesname_list.append(formatted_path)


# 替换单个文件
def replace_onefile(data):
    # 打开文件并读取内容
    with open(data["path"], "r", encoding="utf-8", errors="ignore") as file:
        content = file.read()

    # 替换文本
    new_content = content.replace(data["front"], data["behind"])

    # 将替换后的内容写回文件
    with open(data["path"], "w", encoding="utf-8", errors="ignore") as file:
        file.write(new_content)
    print(f"已完成文件{data['path']}的文本替换")


# 替换多个文件
def replace_directory(file_list, data):
    # 对文件列表的每个文件执行替换程序
    for filename in file_list:
        try:
            data["path"] = filename
            replace_onefile(data)
        except PermissionError:
            print(f"文件{data['path']}出现权限错误或编码错误(默认打开编码为'UTF-8')!")


# 设置全局变量
global all_filesname_list
all_filesname_list = []

if __name__ == "__main__":
    data = index()
    print("{:-^60}".format("程序开始执行"))
    print("执行日志如下:")
    if data["range"] == "1":
        replace_onefile(data)
    elif data["range"] == "2":
        recursive_folders(data["path"], data["format"], data["ignore"])
        replace_directory(all_filesname_list, data)
    print("{:-^60}".format("程序执行完毕"))
